package lagou.homework.lagouhomework.Unit2.q2.code;

import java.util.Scanner;

public class Chess {


    String[][] arr1 = new String[17][17];

    public Chess() {
        chessBoard();    // 进入时先初始化棋盘
        showBoard();     // 展示棋盘
    }


    private void chessBoard(){
        for (int i = 0; i < arr1.length; i++) {
            for (int j = 0; j < arr1[0].length; j++) {
                if (i == 0) {
                    arr1[i][j] = String.format("%x", j - 1);
                } else if (j == 0) {
                    arr1[i][j] = String.format("%x", i - 1);
                } else {
                    arr1[i][j] = "+";
                }
            }
        }

        arr1[0][0] = " ";

    }

    // 展示棋盘情况，后面每正确落子一次 均展示棋盘情况
    public   void  showBoard(){
        for (int i = 0; i < arr1.length; i++) {
            for (int j = 0; j < arr1[i].length; j++) {
                System.out.print(arr1[i][j] + " ");
            }
            System.out.println();
        }

    }

    // 判断是否获胜，获胜后终止本局
    boolean isW  = false;

    // 控制落子方，b为true代表黑方落子，false代表白方落子
    boolean  b = true;

    Scanner sc = new Scanner(System.in);

    // 交替落子，黑方先手
    public void  setPoint(){
        while(!isW) {
            if(b){
                System.out.println("请黑方落子（输入横纵坐标【1-16】：");
                int x = sc.nextInt();
                int y = sc.nextInt();
                if(x<1||y<1||x>16||y>16){
                    System.out.println("落子位置错误，请重新落子！");
                    continue;
                }else if(arr1[x][y] =="+"){
                    arr1[x][y] = "0";
                }else{
                    System.out.println("该格已存在棋子，请重新落子！");
                    continue;
                }
                showBoard();             // 正确落子完毕后展示棋盘上落子情况

                isW = isWin(x,y);       // 每正常落子后判断是否获胜，如获胜，则打印获胜
                if(isW){                // 如果获胜，则展示黑方胜，退出循环（判断条件是!isW）
                    System.out.println("黑方胜！！！");
                }
            }else{
                System.out.println("请白方落子（输入横纵坐标【1-16】：");
                int x = sc.nextInt();
                int y = sc.nextInt();
                // 落子不能超出棋盘位置，x=0 或y=0为显示坐标栏，不能落子；x>16或 y>16则超出棋盘范围
                if(x<1||y<1||x>16||y>16){
                    System.out.println("落子位置错误，请重新落子！");
                    continue;
                }else if(arr1[x][y] =="+"){
                    arr1[x][y] = "1";
                }else{
                    System.out.println("该格已存在棋子，请重新落子！");
                    continue;
                }
                showBoard();           // 正确落子完毕后展示棋盘上落子情况
                isW = isWin(x,y);      // 每正常落子后判断是否获胜，如获胜，则打印获胜
                if(isW){               // 如果获胜，则展示白方胜，退出循环（判断条件是!isW）
                    System.out.println("白方胜！！！");
                }

            }
            b = !b;                 // 易手，交换落子方

        }
    }

    public boolean isWin(int x,int y){
        String color = arr1[x][y];
        isW =false;
        int numX =0;
        for(int i =1;i<arr1[x].length;i++){
            if(arr1[x][i].equals(color)){  // 字符串的比较用equals
                numX = numX +1;
                if(numX == 5){
                    break;
                }
                // System.out.println(numX);
            }else{
                numX= 0;
            }
        }
        int numY =0;
        for(int i =1;i<arr1.length;i++){
            if(arr1[i][y] .equals(color)){
                numY = numY +1;
                if(numY == 5){
                    break;
                }
            }else{
                numY= 0;
            }
        }

        /**
        // 左上方
        int numL1 =0;
        for(int i =-4;i<5;i++){
            if(x<5 || y <5){
                break;
            } else if(arr1[x-i][y-i] .equals(color)){
                numL1 = numL1 +1;
                if(numL1 == 5){
                    break;
                }
            }else{
                numL1= 0;
            }
        }
         */

        //左上方到右下方
        int numL2 =0;
        for(int i =-4;i<5;i++){
            if(x+i>arr1.length-1 || y +i>arr1[x].length-1||x+i<1||y+i<1){
                continue;                       //不能用break 会导致中间落子时计数错误，下同
            } else if(arr1[x+i][y+i] .equals(color)){
                numL2 = numL2 +1;
                if(numL2 == 5){
                    break;
                }
            }else{
                numL2= 0;
            }
        }
        // 左下方到右上方
        int numL3 =0;
        for(int i =-4;i<5;i++){
            if(x-i>arr1.length-1 || y+i<1||x-i<1||y+i>arr1[x].length-1){
                continue;
            } else if(arr1[x-i][y+i] .equals(color)){
                numL3 = numL3 +1;
                if(numL3 == 5){
                    break;
                }
            }else{
                numL3= 0;
            }
        }

 /**
        // 右上方
        int numL4 =0;
        for(int i =-4;i<5;i++){
            if(x-i<0 || y+i>arr1[x].length-1){
                break;
            } else if(arr1[x-i][y+i] .equals(color)){
                numL4 = numL4 +1;
                if(numL4 == 5){
                    break;
                }
            }else{
                numL4= 0;
            }
        }
*/
        if(numX == 5||numY==5||numL2==5||numL3==5){
            isW = true;
        }
        // System.out.println(isW);

        return  isW;


    }





}
